package com.common.utils;

import java.io.File;

import com.beans.ErrorStatusEnum;
import com.common.entity.R;
import com.common.entity.SnowflakeIdWorker;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;

/**
 * 文件上传工具类
 *
 * @author gm
 * @date 2020/6/2
 */
@Component
public class UploadFileUtil {

    /**
     * 静态资源路径
     */
    @Value("${spring.web.resources.static-locations}")
    private String staticLocations;
    /**
     * 域名
     */
    @Value("${domainName}")
    private String domainName;

    /**
     * 文件在磁盘上的绝对路径
     */
    public static String uploadPath;

    @Resource(name = "snowflakeIdWorker")
    private SnowflakeIdWorker snowflakeIdWorker;

    /**
     * 文件上传
     *
     * @param file     文件
     * @param fileType 文件类型
     * @return com.common.entity.R
     * @author gm
     * @date 2020/6/5
     */
    public R uploadPicture(MultipartFile file, String fileType) {
        //yml文件中staticLocations静态资源路径会有file:前缀，使用之前处理一下，放到uploadPath中
        if (!StringUtils.hasLength(uploadPath)) {
            uploadPath = staticLocations.substring(staticLocations.indexOf("file:") + 5);
        }
        if (file == null) {
            return R.error(ErrorStatusEnum.PARAMS_CANNOT_BE_NULL_ERROR.code(), "请传入要上传的文件");
        }
        //验证图片格式
        boolean b = CheckFileFormatUtil.isPicture(file);
        if (!b) {
            return R.error(ErrorStatusEnum.PARAMS_ILLEGAL.code(), "请上传正确格式的图片！");
        }
        //上传时的文件名
        String fileOldName = file.getOriginalFilename();
        //文件相对路径  分隔符不要使用File.separator，Windows环境会变成"\"，无法作为URL访问
        String filePath = "/" + fileType + "/";
        //文件存放到服务器的真实文件名
        String fileName = snowflakeIdWorker.nextId() + fileOldName.substring(fileOldName.lastIndexOf("."));
        //文件存放到磁盘的全路径
        File dest = new File(uploadPath + filePath + fileName);
        try {
            //文件夹不存在会报错，先检查文件夹是否存在
            File dir = new File(uploadPath + filePath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            //将文件写入磁盘
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
            return R.error(ErrorStatusEnum.UPLOAD_FILE_ERROR.code(), ErrorStatusEnum.UPLOAD_FILE_ERROR.message());
        }
        return R.ok().put("data", domainName + filePath + fileName);
    }

    /**
     * 删除图片
     *
     * @param fileName 真实文件名
     * @param fileType 文件类型
     * @return com.common.entity.R
     * @author gm
     * @date 2020/6/5
     */
    public R deletePicture(String fileName, String fileType) {
        //yml文件中staticLocations静态资源路径会有file:前缀，使用之前处理一下，放到uploadPath中
        if (StringUtils.hasLength(uploadPath)) {
            uploadPath = staticLocations.substring(staticLocations.indexOf("file:") + 5);
        }
        String filePath = uploadPath + File.separator + fileType + File.separator + fileName;
        new File(filePath).delete();
        return R.ok();
    }
}
